Jackson ব্যবহার করে Java Enum হ্যান্ডল করা একটি সাধারণ এবং কার্যকর প্রক্রিয়া। এটি Enum-এর মানগুলো JSON-এ সিরিয়ালাইজ বা ডেসিরিয়ালাইজ করতে এবং প্রয়োজনে কাস্টম ফরম্যাটিং প্রয়োগ করতে সাহায্য করে।
১. Enum-কে JSON-এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
public class EnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Enum সিরিয়ালাইজ করা
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json);
// Enum ডেসিরিয়ালাইজ করা
Status status = objectMapper.readValue("\"INACTIVE\"", Status.class);
System.out.println("Deserialized Enum: " + status);
}
public enum Status {
ACTIVE, INACTIVE, PENDING;
}
}
আউটপুট:
Serialized JSON: "ACTIVE"
Deserialized Enum: INACTIVE
২. কাস্টম Enum সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন
যদি আপনি চান Enum-এর ডিফল্ট মানের পরিবর্তে কাস্টম স্ট্রিং ব্যবহার করতে, @JsonValue এবং @JsonCreator ব্যবহার করতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public class CustomEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Enum সিরিয়ালাইজ করা
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json);
// Enum ডেসিরিয়ালাইজ করা
Status status = objectMapper.readValue("\"Pending Status\"", Status.class);
System.out.println("Deserialized Enum: " + status);
}
public enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String description;
Status(String description) {
this.description = description;
}
@JsonValue
public String getDescription() {
return description;
}
@JsonCreator
public static Status forValue(String value) {
for (Status status : values()) {
if (status.description.equalsIgnoreCase(value)) {
return status;
}
}
throw new IllegalArgumentException("Unknown value: " + value);
}
}
}
আউটপুট:
Serialized JSON: "Active Status"
Deserialized Enum: PENDING
৩. Enum-এর সাথে অতিরিক্ত তথ্য সিরিয়ালাইজ করা
যদি আপনি Enum-এর সাথে অতিরিক্ত ডেটা সংযুক্ত করতে চান, তাহলে আপনি একটি কাস্টম Serializer ব্যবহার করতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
public class AdvancedEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Enum সিরিয়ালাইজ করা
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json);
}
@JsonSerialize(using = StatusSerializer.class)
public enum Status {
ACTIVE("Active Status", 1),
INACTIVE("Inactive Status", 0),
PENDING("Pending Status", 2);
private final String description;
private final int code;
Status(String description, int code) {
this.description = description;
this.code = code;
}
public String getDescription() {
return description;
}
public int getCode() {
return code;
}
}
public static class StatusSerializer extends JsonSerializer<Status> {
@Override
public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("description", status.getDescription());
gen.writeNumberField("code", status.getCode());
gen.writeEndObject();
}
}
}
আউটপুট:
{
"description": "Active Status",
"code": 1
}
৪. Enum ডেসিরিয়ালাইজ করার সময় ভিন্ন ফরম্যাট হ্যান্ডল করা
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
public class FlexibleEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// JSON ডেটা বিভিন্ন ফরম্যাটে
String json1 = "\"ACTIVE\"";
String json2 = "\"active\"";
Status status1 = objectMapper.readValue(json1, Status.class);
Status status2 = objectMapper.readValue(json2, Status.class);
System.out.println("Status1: " + status1);
System.out.println("Status2: " + status2);
}
public enum Status {
ACTIVE, INACTIVE, PENDING;
// Case-insensitive ডেসিরিয়ালাইজেশন
@JsonCreator
public static Status forValue(String value) {
return Status.valueOf(value.toUpperCase());
}
}
}
আউটপুট:
Status1: ACTIVE
Status2: ACTIVE
গুরুত্বপূর্ণ পয়েন্ট
- ডিফল্ট সিরিয়ালাইজেশন: Enum-এর
name()পদ্ধতির মান JSON এ সংরক্ষিত হয়। - কাস্টম ভ্যালু হ্যান্ডলিং:
@JsonValueএবং@JsonCreatorকাস্টমাইজেশন করতে ব্যবহার করা হয়। - কেস-ইনসেনসিটিভ ডেসিরিয়ালাইজেশন:
@JsonCreatorব্যবহার করে JSON ভ্যালু Uppercase, Lowercase বা Mixed Case হ্যান্ডল করা যায়। - অতিরিক্ত তথ্য সংযুক্তি: কাস্টম Serializer ব্যবহার করে Enum-এর সাথে অতিরিক্ত ডেটা সিরিয়ালাইজ করা যায়।
Jackson দিয়ে Java Enum হ্যান্ডল করা খুবই সহজ এবং শক্তিশালী। ডিফল্ট ফিচারগুলো ছাড়াও কাস্টমাইজেশন করার জন্য বেশ কিছু Annotation এবং Serializer পাওয়া যায়। Enum-এর ক্ষেত্রে @JsonValue এবং @JsonCreator সবচেয়ে বেশি ব্যবহৃত হয় কাস্টম মান হ্যান্ডল করার জন্য।
Jackson লাইব্রেরি Java-এর Enum টাইপের সাথে JSON ডেটা আদান-প্রদানের সময় Serialization (Java থেকে JSON) এবং Deserialization (JSON থেকে Java)-কে সাপোর্ট করে।
Serialization এবং Deserialization কি?
- Serialization: Java Enum-কে JSON ফরম্যাটে রূপান্তর।
- Deserialization: JSON ফরম্যাট থেকে Enum টাইপে রূপান্তর।
Default Behavior
Jackson Enum-এর ক্ষেত্রে ডিফল্টভাবে Enum-এর name() মেথড ব্যবহার করে Serialization এবং valueOf() মেথড ব্যবহার করে Deserialization করে।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
enum Status {
ACTIVE,
INACTIVE,
PENDING
}
public class EnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Enum Serialization
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json); // "ACTIVE"
// Enum Deserialization
Status status = objectMapper.readValue("\"ACTIVE\"", Status.class);
System.out.println("Deserialized Enum: " + status); // ACTIVE
}
}
Custom Enum Serialization এবং Deserialization
কখনও কখনও Enum-এ কাস্টম স্ট্রিং বা ভিন্ন মান সিরিয়ালাইজ করতে হয়। এই ক্ষেত্রে Jackson-এর @JsonValue এবং @JsonCreator ব্যবহার করা হয়।
কাস্টম মানসহ উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;
enum Status {
ACTIVE("active_status"),
INACTIVE("inactive_status"),
PENDING("pending_status");
private final String value;
// Constructor
Status(String value) {
this.value = value;
}
// Serialization এর জন্য
@JsonValue
public String getValue() {
return value;
}
// Deserialization এর জন্য
@JsonCreator
public static Status fromValue(String value) {
for (Status status : Status.values()) {
if (status.value.equals(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid value: " + value);
}
}
public class CustomEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Serialization
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json); // "active_status"
// Deserialization
Status status = objectMapper.readValue("\"inactive_status\"", Status.class);
System.out.println("Deserialized Enum: " + status); // INACTIVE
}
}
Enum-এর সাথে JSON ফিল্ডসহ কাজ করা
কখনও Enum একটি JSON অবজেক্টের অংশ হতে পারে। উদাহরণস্বরূপ, যখন Enum JSON অবজেক্টের একটি ফিল্ড হিসেবে ব্যবহৃত হয়:
import com.fasterxml.jackson.databind.ObjectMapper;
enum Status {
ACTIVE, INACTIVE, PENDING
}
class User {
private String name;
private Status status;
// Constructor
public User(String name, Status status) {
this.name = name;
this.status = status;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
public class EnumWithObjectExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// User Object তৈরি
User user = new User("John Doe", Status.ACTIVE);
// Serialization
String json = objectMapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + json);
// Deserialization
User deserializedUser = objectMapper.readValue(json, User.class);
System.out.println("Deserialized User: " + deserializedUser.getName() + ", " + deserializedUser.getStatus());
}
}
আউটপুট:
Serialized JSON: {"name":"John Doe","status":"ACTIVE"}
Deserialized User: John Doe, ACTIVE
Key Annotations এবং তাদের ভূমিকা
@JsonValue:- Enum-এর সিরিয়ালাইজেশনের সময় একটি নির্দিষ্ট মান (string বা অন্য কিছু) ব্যবহার করতে দেয়।
- উদাহরণ:
"active_status"।
@JsonCreator:- Deserialization-এর সময় JSON থেকে Enum-এ রূপান্তরের নিয়ম নির্ধারণ করে।
- উদাহরণ: JSON ভ্যালু থেকে Enum-এ কাস্টম রূপান্তর।
Custom Serializer এবং Deserializer ব্যবহার:
কখনও ডিফল্ট Jackson মেকানিজম যথেষ্ট না হলে আমরা কাস্টম Serializer/Deserializer ব্যবহার করতে পারি।
Custom Serializer:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class StatusSerializer extends JsonSerializer<Status> {
@Override
public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(status.name().toLowerCase()); // ছোট হরফে Enum নাম
}
}
Custom Deserializer:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
return Status.valueOf(value.toUpperCase()); // বড় হরফে Enum নাম
}
}
Serializer/Deserializer ব্যবহারের উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
public class CustomEnumSerializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// মডিউল তৈরি এবং Serializer/Deserializer সেট করা
SimpleModule module = new SimpleModule();
module.addSerializer(Status.class, new StatusSerializer());
module.addDeserializer(Status.class, new StatusDeserializer());
objectMapper.registerModule(module);
// Serialization
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json); // "active"
// Deserialization
Status status = objectMapper.readValue("\"inactive\"", Status.class);
System.out.println("Deserialized Enum: " + status); // INACTIVE
}
}
- ডিফল্ট Behavior: Enum-এর
name()এবংvalueOf()মেথড ব্যবহার করে। - কাস্টমাইজেশন:
@JsonValueএবং@JsonCreatorদিয়ে সহজ কাস্টমাইজেশন। - Custom Serializer/Deserializer: আরও জটিল প্রয়োজনের জন্য উপযোগী।
- ব্যবহার: API ডেভেলপমেন্টে Enum ডেটা প্রক্রিয়াকরণ ও কাস্টমাইজেশনের জন্য অত্যন্ত কার্যকর।
Jackson Enum ডেটার Serialization (Java Enum থেকে JSON এ রূপান্তর) এবং Deserialization (JSON থেকে Java Enum এ রূপান্তর) এর জন্য ডিফল্ট পদ্ধতি ব্যবহার করে। তবে, কখনও কখনও Enum ডেটা কাস্টম ফরম্যাটে Serialize করতে হতে পারে। এ জন্য Jackson এ কাস্টম Serializer তৈরি করা হয়।
১. ডিফল্ট Serialization পদ্ধতি
Jackson ডিফল্টভাবে Enum এর name() মেথড ব্যবহার করে JSON ডেটা তৈরি করে।
উদাহরণ
public enum Status {
ACTIVE,
INACTIVE,
PENDING
}
Serialization
import com.fasterxml.jackson.databind.ObjectMapper;
public class DefaultEnumSerialization {
public static void main(String[] args) throws Exception {
Status status = Status.ACTIVE;
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(status);
System.out.println(json); // Output: "ACTIVE"
}
}
২. Enum এর জন্য Custom Serializer তৈরি
স্টেপ ১: Custom Serializer ক্লাস তৈরি
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
public class StatusSerializer extends StdSerializer<Status> {
public StatusSerializer() {
super(Status.class);
}
@Override
public void serialize(Status value, JsonGenerator gen, SerializerProvider provider) throws IOException {
// Custom Serialization Logic
gen.writeString(value.name().toLowerCase()); // Example: ACTIVE -> "active"
}
}
স্টেপ ২: Enum ক্লাসে Serializer সংযুক্ত করা
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(using = StatusSerializer.class)
public enum Status {
ACTIVE,
INACTIVE,
PENDING
}
Serialization উদাহরণ
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomEnumSerialization {
public static void main(String[] args) throws Exception {
Status status = Status.ACTIVE;
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(status);
System.out.println(json); // Output: "active"
}
}
৩. Enum এর সাথে অতিরিক্ত ডেটা Serialize করা
স্টেপ ১: Enum এ অতিরিক্ত ফিল্ড যোগ করা
public enum Status {
ACTIVE("The user is active"),
INACTIVE("The user is inactive"),
PENDING("The user is pending approval");
private final String description;
Status(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
স্টেপ ২: Custom Serializer তৈরি
public class StatusSerializer extends StdSerializer<Status> {
public StatusSerializer() {
super(Status.class);
}
@Override
public void serialize(Status value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeStringField("status", value.name());
gen.writeStringField("description", value.getDescription());
gen.writeEndObject();
}
}
স্টেপ ৩: Serialization
@JsonSerialize(using = StatusSerializer.class)
public enum Status {
ACTIVE("The user is active"),
INACTIVE("The user is inactive"),
PENDING("The user is pending approval");
private final String description;
Status(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomEnumSerializationWithDetails {
public static void main(String[] args) throws Exception {
Status status = Status.ACTIVE;
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(status);
System.out.println(json);
}
}
Output:
{
"status": "ACTIVE",
"description": "The user is active"
}
৪. Enum এর Deserialization কাস্টমাইজ করা
Custom Deserializer তৈরি
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getText().toUpperCase(); // Example: "active" -> "ACTIVE"
return Status.valueOf(value);
}
}
Enum ক্লাসে Deserializer সংযুক্ত করা
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@JsonDeserialize(using = StatusDeserializer.class)
public enum Status {
ACTIVE,
INACTIVE,
PENDING
}
Deserialization উদাহরণ
public class CustomEnumDeserialization {
public static void main(String[] args) throws Exception {
String json = "\"active\""; // JSON string
ObjectMapper mapper = new ObjectMapper();
Status status = mapper.readValue(json, Status.class);
System.out.println(status); // Output: ACTIVE
}
}
- Custom Serializer ব্যবহার করে Enum এর ফরম্যাট কাস্টমাইজ করা যায়।
- Custom Deserializer ব্যবহার করে JSON থেকে Enum এ ডেটা মেপিং নিয়ন্ত্রণ করা যায়।
- এই পদ্ধতিগুলো API ডেভেলপমেন্টে, বিশেষত যেখানে Enum ডেটা হিউম্যান-রিডেবল বা কাস্টম ফরম্যাটে থাকা দরকার, সেগুলোতে কার্যকর।
Jackson-এ Enum Mapping এবং Complex JSON Structure নিয়ে কাজ করা খুবই সহজ এবং কার্যকর। Jackson JSON ডেটার সঙ্গে জাভার enum টাইপ এবং জটিল কাঠামো যেমন নেস্টেড অবজেক্ট, অ্যারে, বা ম্যাপ হ্যান্ডেল করতে উন্নত API সরবরাহ করে।
1. Enum Mapping
Jackson সহজেই JSON ডেটার সঙ্গে Java enum টাইপ ম্যাপ করতে পারে। এছাড়া, কাস্টম নাম বা মান ব্যবহার করতে চাইলে বিশেষ এনোটেশন ব্যবহার করা যায়।
উদাহরণ: Enum Mapping
Enum ক্লাস:
enum Status {
ACTIVE,
INACTIVE,
PENDING
}
JSON:
{
"id": 101,
"name": "John Doe",
"status": "ACTIVE"
}
কোড:
import com.fasterxml.jackson.databind.ObjectMapper;
class User {
public int id;
public String name;
public Status status;
}
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 101,
"name": "John Doe",
"status": "ACTIVE"
}
""";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(json, User.class);
System.out.println("ID: " + user.id);
System.out.println("Name: " + user.name);
System.out.println("Status: " + user.status);
// Serialize back to JSON
String serializedJson = objectMapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + serializedJson);
}
}
আউটপুট:
ID: 101
Name: John Doe
Status: ACTIVE
Serialized JSON: {"id":101,"name":"John Doe","status":"ACTIVE"}
Custom Enum Mapping
কাস্টম মান ব্যবহার করতে চাইলে @JsonValue এবং @JsonCreator ব্যবহার করা হয়।
কোড:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
enum Status {
ACTIVE("active"),
INACTIVE("inactive"),
PENDING("pending");
private final String value;
Status(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
@JsonCreator
public static Status fromValue(String value) {
for (Status status : values()) {
if (status.value.equals(value)) {
return status;
}
}
throw new IllegalArgumentException("Unknown value: " + value);
}
}
2. Complex JSON Structure
Jackson জটিল JSON কাঠামো যেমন নেস্টেড অবজেক্ট, লিস্ট, এবং ম্যাপ হ্যান্ডেল করতে সক্ষম।
উদাহরণ: Complex JSON Structure
JSON:
{
"id": 101,
"name": "John Doe",
"address": {
"city": "Dhaka",
"zip": "1212"
},
"skills": ["Java", "Spring", "Jackson"],
"metadata": {
"createdBy": "admin",
"updatedBy": "editor"
}
}
কোড:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
class Address {
public String city;
public String zip;
}
class User {
public int id;
public String name;
public Address address;
public List<String> skills;
public Map<String, String> metadata;
}
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"id": 101,
"name": "John Doe",
"address": {
"city": "Dhaka",
"zip": "1212"
},
"skills": ["Java", "Spring", "Jackson"],
"metadata": {
"createdBy": "admin",
"updatedBy": "editor"
}
}
""";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(json, User.class);
// Printing user details
System.out.println("ID: " + user.id);
System.out.println("Name: " + user.name);
System.out.println("City: " + user.address.city);
System.out.println("Skills: " + user.skills);
System.out.println("Metadata: " + user.metadata);
// Serialize back to JSON
String serializedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println("Serialized JSON:\n" + serializedJson);
}
}
আউটপুট:
ID: 101
Name: John Doe
City: Dhaka
Skills: [Java, Spring, Jackson]
Metadata: {createdBy=admin, updatedBy=editor}
Serialized JSON:
{
"id": 101,
"name": "John Doe",
"address": {
"city": "Dhaka",
"zip": "1212"
},
"skills": ["Java", "Spring", "Jackson"],
"metadata": {
"createdBy": "admin",
"updatedBy": "editor"
}
}
Key Features:
- Enum Mapping:
- Enum এর স্ট্রিং ম্যানিপুলেশন সহজ।
- কাস্টম ভ্যালু (যেমন "active") সেট করা যায়।
- Complex JSON Structure:
- নেস্টেড অবজেক্ট এবং অ্যারে সহজেই হ্যান্ডেল করা যায়।
- Dynamic JSON এর জন্য ম্যাপ ব্যবহার করা হয়।
ব্যবহারিক ক্ষেত্র:
- API ডেভেলপমেন্ট যেখানে Enum এবং জটিল JSON কাঠামো কাজ করে।
- ডাটা প্রসেসিং এবং JSON থেকে Java Object Mapping।
এই পদ্ধতিগুলো ব্যবহার করে সহজেই Enum এবং জটিল JSON কাঠামো পরিচালনা করা যায়।
Jackson লাইব্রেরি ডিফল্টভাবে Java Enum কে JSON-এ serialize এবং deserialize করতে পারে। তবে কখনো কখনো আপনাকে Enum-এর ডিফল্ট serialization বা deserialization কাস্টমাইজ করতে হতে পারে। Jackson Enum কাস্টমাইজ করার জন্য অনেক ফিচার সরবরাহ করে, যেমন @JsonValue, @JsonCreator, এবং কাস্টম serializers/deserializers।
ডিফল্ট Enum Serialization এবং Deserialization
ডিফল্টভাবে, Jackson Enum-এর name (যেমন, Enum.name()) serialize করে।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
public class DefaultEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Enum Serialization
Status status = Status.ACTIVE;
String json = mapper.writeValueAsString(status);
System.out.println("Serialized JSON: " + json);
// Enum Deserialization
Status deserializedStatus = mapper.readValue("\"ACTIVE\"", Status.class);
System.out.println("Deserialized Enum: " + deserializedStatus);
}
}
enum Status {
ACTIVE, INACTIVE, PENDING
}
আউটপুট:
Serialized JSON: "ACTIVE"
Deserialized Enum: ACTIVE
1. @JsonValue এর মাধ্যমে Enum Serialization কাস্টমাইজ করা
@JsonValue ব্যবহার করে Enum কে কাস্টম string, number বা অন্য ফরম্যাটে serialize করা যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonValue;
enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String displayName;
Status(String displayName) {
this.displayName = displayName;
}
@JsonValue
public String getDisplayName() {
return displayName;
}
}
public class JsonValueExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Serialization
Status status = Status.ACTIVE;
String json = mapper.writeValueAsString(status);
System.out.println("Serialized JSON: " + json);
}
}
আউটপুট:
Serialized JSON: "Active Status"
2. @JsonCreator এর মাধ্যমে Enum Deserialization কাস্টমাইজ করা
@JsonCreator ব্যবহার করে JSON থেকে Enum কে কাস্টমভাবে deserialize করা যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String displayName;
Status(String displayName) {
this.displayName = displayName;
}
@JsonValue
public String getDisplayName() {
return displayName;
}
@JsonCreator
public static Status forValue(String value) {
for (Status status : values()) {
if (status.displayName.equalsIgnoreCase(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid Status: " + value);
}
}
public class JsonCreatorExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Deserialization
Status status = mapper.readValue("\"Active Status\"", Status.class);
System.out.println("Deserialized Enum: " + status);
}
}
আউটপুট:
Deserialized Enum: ACTIVE
3. Enum Serialization এবং Deserialization কাস্টম Serializer/Deserializer ব্যবহার করে
Jackson-এ কাস্টম Serializer এবং Deserializer তৈরি করে Enum কাস্টমাইজ করা যায়।
Serializer এবং Deserializer তৈরি:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
// Custom Serializer
class StatusSerializer extends JsonSerializer<Status> {
@Override
public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(status.getDisplayName().toUpperCase());
}
}
// Custom Deserializer
class StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt)
throws IOException {
String value = p.getValueAsString();
for (Status status : Status.values()) {
if (status.getDisplayName().equalsIgnoreCase(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid Status: " + value);
}
}
// Enum with Custom Serializer/Deserializer
@JsonSerialize(using = StatusSerializer.class)
@JsonDeserialize(using = StatusDeserializer.class)
enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String displayName;
Status(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
ব্যবহার:
public class CustomSerializerDeserializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Serialization
Status status = Status.ACTIVE;
String json = mapper.writeValueAsString(status);
System.out.println("Serialized JSON: " + json);
// Deserialization
Status deserializedStatus = mapper.readValue("\"ACTIVE STATUS\"", Status.class);
System.out.println("Deserialized Enum: " + deserializedStatus);
}
}
আউটপুট:
Serialized JSON: "ACTIVE STATUS"
Deserialized Enum: ACTIVE
4. JSON ফিল্ডের মাধ্যমে Enum Map করা
যদি JSON এ Enum ফিল্ড অন্য কোনো ফিল্ডের মান অনুসারে নির্ধারিত হয়, তাহলে এটি কাস্টমভাবে পরিচালনা করতে হয়।
উদাহরণ:
enum PaymentStatus {
SUCCESS, FAILURE, PENDING
}
class Payment {
private String transactionId;
private PaymentStatus status;
// Getters and Setters
public String getTransactionId() {
return transactionId;
}
public void setTransactionId(String transactionId) {
this.transactionId = transactionId;
}
public PaymentStatus getStatus() {
return status;
}
public void setStatus(PaymentStatus status) {
this.status = status;
}
}
public class PaymentExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// JSON to Object
String json = """
{
"transactionId": "TXN12345",
"status": "SUCCESS"
}
""";
Payment payment = mapper.readValue(json, Payment.class);
System.out.println("Payment Status: " + payment.getStatus());
}
}
আউটপুট:
Payment Status: SUCCESS
Jackson-এর মাধ্যমে Enum serialization এবং deserialization কাস্টমাইজ করতে:
@JsonValueএবং@JsonCreatorসাধারণত সহজ এবং কার্যকর।- কাস্টম Serializer/Deserializer জটিল কেসের জন্য প্রয়োজন।
- API-এর ভিন্ন ভিন্ন কনটেক্সটে Enum কাস্টমাইজ করার জন্য কাস্টমাইজেশন গুরুত্বপূর্ণ।
আপনার প্রয়োজনের উপর নির্ভর করে সঠিক পদ্ধতি নির্বাচন করুন।
Read more